﻿Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel
Imports NHibernate
Imports NHibernate.Transaction
Imports SIAVU.Dominio

Namespace Persistencia
    Public Class UsuarioPersistencia

        Public Sub Add(ByVal oUsuario As Usuario)
            Using session As ISession = NHibernateHelper.OpenSession()
                Using transaction As ITransaction = session.BeginTransaction()
                    session.Save(oUsuario)
                    transaction.Commit()
                End Using
            End Using
        End Sub

        Public Function getByLegajo(ByVal legajo As Long) As List(Of Usuario)
            Dim session As ISession = Nothing
            Try
                session = NHibernateHelper.OpenSession
                Return session.CreateCriteria(GetType(Usuario)).Add(Criterion.Expression.Eq("Legajo", legajo)).List(Of Usuario)()
            Catch ex As Exception
                Throw
            Finally
                session.Close()
            End Try
        End Function

        Public Sub getById(ByRef oUsuario As Usuario)
            Dim session As ISession = Nothing
            Try
                session = NHibernateHelper.OpenSession
                oUsuario = DirectCast(session.Get(GetType(Usuario), oUsuario.UsuarioID), Usuario)

            Catch ex As Exception
                Throw
            Finally
                session.Close()
            End Try
        End Sub

        Public Function getProgramaciones(ByRef UsuarioID As Long, ByVal eTipoProgramacionID As ETipoProgramacion) As IList(Of Programacion)
            Dim session As ISession = Nothing
            Try
                session = NHibernateHelper.OpenSession
                Dim iTipoProgramacionID As Integer = eTipoProgramacionID
                session.EnableFilter("FiltroTipoProgramacion").SetParameter("TipoProgramacionID", iTipoProgramacionID.ToString)
                Dim objUsuario As Usuario
                objUsuario = DirectCast(session.Get(GetType(Usuario), UsuarioID), Usuario)
                If objUsuario IsNot Nothing Then
                    Select Case eTipoProgramacionID
                        Case ETipoProgramacion.PlanVuelo
                            If objUsuario.PlanesVuelos.Count > 0 Then
                                Return objUsuario.PlanesVuelos
                            Else
                                Return Nothing
                            End If
                        Case ETipoProgramacion.PreProgramacion
                            If objUsuario.PreProgramaciones.Count > 0 Then
                                Return objUsuario.PreProgramaciones
                            Else
                                Return Nothing
                            End If
                        Case ETipoProgramacion.ProgramacionAsignada
                            If objUsuario.ProgramacionesAsignadas.Count > 0 Then
                                Return objUsuario.ProgramacionesAsignadas
                            Else
                                Return Nothing
                            End If
                        Case ETipoProgramacion.VueloRealizado
                            If objUsuario.VuelosRealizados.Count > 0 Then
                                Return objUsuario.VuelosRealizados
                            Else
                                Return Nothing
                            End If
                    End Select
                Else
                    Return Nothing
                End If
            Catch ex As Exception
                Throw
            Finally
                session.Close()
            End Try
        End Function

        Public Function getRoles(ByRef UsuarioID As Long) As IList(Of Rol)
            Dim session As ISession = Nothing
            Try
                session = NHibernateHelper.OpenSession
                Dim objUsuario As Usuario
                objUsuario = DirectCast(session.Get(GetType(Usuario), UsuarioID), Usuario)
                If objUsuario IsNot Nothing AndAlso objUsuario.Roles.Count > 0 Then
                    Return objUsuario.Roles
                Else
                    Return Nothing
                End If
            Catch ex As Exception
                Throw
            Finally
                session.Close()
            End Try
        End Function

        Public Sub Remove(ByVal oUsuario As Usuario)

        End Sub

        Public Sub Update(ByVal oUsuario As Usuario)

        End Sub

        Public Sub ActualizarActividadesProgramacion(ByVal oUsuario As Usuario, ByVal oListaActividadesEliminadas As IList(Of Actividad), ByVal eTipoProgramacion As ETipoProgramacion, ByVal oProgramacion As Programacion)
            Dim session As ISession = NHibernateHelper.OpenSession()
            Dim oTransaccion As ITransaction = Nothing
            Try
                oTransaccion = session.BeginTransaction()
                oTransaccion.Begin()

                '//Decremento la cantidad de subscriptos en las postas que el usuario desselecciono
                If (oListaActividadesEliminadas IsNot Nothing) Then
                    For Each oActividad As Actividad In oListaActividadesEliminadas
                        If oActividad.GetType() Is System.Type.GetType("SIAVU.Dominio.ActividadPosta") Then
                            session.Update(DirectCast(oActividad, ActividadPosta).Posta)
                        End If
                    Next
                End If

                If eTipoProgramacion = Dominio.ETipoProgramacion.PreProgramacion Then
                    For Each oActividad As Actividad In oProgramacion.Actividades
                        If oActividad.GetType() Is System.Type.GetType("SIAVU.Dominio.ActividadPosta") Then
                            session.Update(DirectCast(oActividad, ActividadPosta).Posta)
                        End If
                    Next
                End If

                session.SaveOrUpdate(oUsuario)
                oTransaccion.Commit()

            Catch ex As Exception
                oTransaccion.Rollback()
                Throw

            Finally
                session.Close()

            End Try
        End Sub

        Public Sub ConfimarVueloSinTransaccion(ByVal oUsuario As Usuario, ByRef session As ISession)
            Try
                session.SaveOrUpdate(oUsuario)

            Catch ex As Exception
                Throw

            End Try
        End Sub

    End Class
End Namespace
